package com.cebbank.yyi.springbootapp.service;

import com.cebbank.yyi.springbootapp.bo.*;
import com.cebbank.yyi.springbootapp.tables.*;
import com.cebbank.yyi.springbootapp.tables.TableInfoBO;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

/**
 * @description: 操作数据库
 * @author: yyi
 * @version: 1.0
 **/

public interface ExcelService {

    /**
     * @description: 根据表头信息和读取的Excel信息支持插入数据库
     * @param: ImportData 包含表结构信息 该表结构对应的数据信息
     * @return: 无
     * @author: yyi
     * @version: 1.0
    **/
    void insertValue(ImportDataBO importDataBO);


    /**
     * @description: 根据Excel表头信息创建对应的表结构 包含字段大小  注释  索引等
     * @param: 创建的表结构的属性，支持多个sheet， 一个sheet对应一个CreateTablesBO
     * 其中字段名称是根据excel中的列名取拼音得到的
     * @return: 无
     * @author: yyi
     * @version: 1.0
    **/
    void createTable(List<CreateTablesBO> list);



    /**
     * @description: 读取完Excel后返回导入数据库的表结构
     * 以方便后续前端 或者postman传入Sql进行数据的过滤和清洗等
     * @param: inputStream excel文件输入流，支持多个sheet页的导入
     * @return: 返回各个sheet页对应的表结构，方便用户根据表结构写sql 进行数据的清理 过滤
     * @author: yyi
     * @version: 1.0
    **/
    List<CreateTablesBO> importExcel(InputStream inputStream) throws Exception;


    /**
     * @description: 支持执行前端上送的sql，即过滤清洗的操作
     * @param: sql 上送的sql语句
     * @return: List<Map<String, Object>> 返回sql语句的查询结果
     * @author: yyi
     * @version: 1.0
    **/
    List<HashMap<String, Object>> executeSql(String sql);

    /**
     * @description: 将一个List<Map<String, Object>>到入到Excel中，支持多sheet页面的导入
     * @param: list 对应写入的数据， exportDataBo 对应sheet页的表结构，excelPath 生成excel的位置
     * @return: 生成处理后的Excel表格
     * @author: yyi
     * @version: 1.0
    **/
    void dataToExcel(List<HashMap<String, Object>> list, ExportDataBO exportDataBo, String excelPath);

    /**
     * @description: 将来一个区域相同的数据进行单元格的合并(支持单个sheet页的合并)
     * @param: is excel文件流， excelFilePath 生成excel的地址，row 开始合并的行号，需要单独处理的行号和列号
     * @return: void 生成文件
     * @author: yyi
     * @version: 1.0
    **/
    void mergeCell(InputStream is, String excelFilePath, int row, ExcelFormatBO list) throws IOException;

    /**
     * @description: 上传多个excel 将所有的数据进行合并, 要求excel的所有的格式一致
     * @param: files 对应的多个Excel文件，excelFilePath 导出excel的位置
     * @return: 输出格式化后的Excel
     * @author: yyi
     * @version: 1.0
    **/
    void mergeAllExcel(List<MultipartFile> files, String excelFilePath) throws Exception;

    /**
     * @description: 获取指定的表结构
     * @param: tableName 表名称
     * @return:
     * @author: yyi
     * @version: 1.0
    **/
    List<String> getTableFields(String tableName);


    /**
     * @description: 导出指定列的Excel 包含设置样式 sheetName titleName fileName等
     * @param: exportFiledsBO 前端入参
     * @return:
     * @author: yyi
     * @version: 1.0
    **/
    void exportExcelFields(ExportFiledsBO exportFiledsBO);

    /**
     * @description: 支持导出Excel按照字段区分  并拆分成不同的Excel或者Sheet页
     * @param: 拆分查找Excel对应的信息 包含表名 字段名称 样式等
     * @return: 无
     * @author: yyi
     * @version: 1.0
    **/
    void exportExcelFieldsSplit(ExportFiledExtendBO exportFiledExtendBO);
    /**
     * @description: 支持将多个表结构导入到同一个excel文件中
     * @param: List<String> 待导出的数据局表Name
     * @return: 暂定void
     * @author: yyi
     * @version: 1.0
    **/
    void exportExcelSheet(List<TableInfoBO> tablesNames);

    /**
     * @description: 根据模板生成填充数据
     * @param: data待填充的数据
     * @return: 生成按照模板输出的excel
     * @author: yyi
     * @version: 1.0
    **/
    void exportExcelByTemplate(HashMap<String, Object> data, String excelPath);

    /**
     * @description: 获取当前数据库中的所有的数据表  为后续导出数据使用
     * @param:
     * @return:
     * @author: yyi
     * @version: 1.0
    **/
    List<String> getAllTables();


    /**
     * @description: 支持读取对应的Excel 并支持通过sql进行过滤
     * @param: inputStream 待读取的文件流 sql 支持执行的sql num 开始读取的行数
     * @return:
     * @author: yyi
     * @version: 1.0
    **/
    void readExcel(InputStream inputStream, String sql, int num);

    /**
     * @description: 合并指定类的Excel
     * @param: sheet 对应的sheet对象 mergeCellBO 导出Excel的样式 excelPath 输出的Excel
     * @return:
     * @author: yyi
     * @version: 1.0
    **/
    void mergeSameCellsInColumn(InputStream is, MergeCellBO mergeCellBO, String excelPath) throws IOException;


    /**
     * @description: 将指定sql的查询结果集映射到Excel中
     * @param: list 待拆分的列
     * @return: 拆分后的文件夹
     * @author: yyi
     * @version: 1.0
    **/
    void splitByParam(InputStream file, SplitFileBO list) throws Exception;
}
